[id].js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import React, { Component } from 'react';
  2. import BasePage from "@/components/Layout/BasePage";
  3. import { addDaftarHadirPeserta } from '../../../actions/catatan';
  4. import { getAutoSave } from "@/actions/autosave";
  5. import ContentWrapper from "@/components/Layout/ContentWrapper";
  6. import { Row, Col, Card, CardBody, Button, Modal, ModalBody, ModalFooter, FormGroup, Input, Navbar, NavItem, NavLink, NavbarBrand } from "reactstrap";
  7. import { Formik, Form, Field, ErrorMessage } from "formik";
  8. import * as Yup from "yup";
  9. import SignatureCanvas from 'react-signature-canvas'
  10. import { addPesertaPleno } from '../../../actions/public';
  11. import { toast } from "react-toastify";
  12. import Router from "next/router";
  13. import swal from "sweetalert2";
  14. import Link from 'next/dist/client/link';
  15. import moment from 'moment';
  16. class PlenoSanksi extends Component {
  17. constructor(props) {
  18. super(props);
  19. this.state = {
  20. dataLaporan: {},
  21. modal: false,
  22. signature: "",
  23. nama: "",
  24. data: {},
  25. changesign: false,
  26. pageDone: false,
  27. }
  28. }
  29. static getInitialProps = async ({ query }) => {
  30. return { query };
  31. };
  32. componentDidMount = async () => {
  33. };
  34. toggleModal = (value = true) => {
  35. if (!value) {
  36. this.setState({ modal: false });
  37. } else {
  38. this.setState({ modal: !this.state.modal });
  39. }
  40. };
  41. sigPad = []
  42. clear = () => {
  43. this.sigPad.clear()
  44. }
  45. updateValueSignature = () => {
  46. const addsig = this.sigPad.getTrimmedCanvas().toDataURL('image/png')
  47. this.setState({
  48. signature: addsig,
  49. changesign: true
  50. })
  51. }
  52. updateValueNama = (e) => {
  53. this.setState({ nama: e.target.value });
  54. }
  55. onSubmit = async (e) => {
  56. const { query, token } = this.props;
  57. const { id } = query;
  58. const sign = this.state.signature
  59. const blob = await (await fetch(sign)).blob();
  60. const files = new File([blob], new Date().valueOf() + 'image.png', { type: blob.type })
  61. const formdata = new FormData();
  62. formdata.append("ttd", files);
  63. formdata.append("catatan_id", id);
  64. formdata.append("nama", this.state.nama);
  65. const added = await addDaftarHadirPeserta(token, formdata, id);
  66. const toastid = toast.loading("Please wait...");
  67. if (!added) {
  68. swal.fire({
  69. title: "Gagal Input Tanda Tangan",
  70. icon: "error",
  71. confirmButtonColor: "#3e3a8e",
  72. });
  73. } else {
  74. swal.fire({
  75. title: "Berhasil Input Tanda Tangan",
  76. icon: "success",
  77. confirmButtonColor: "#3e3a8e",
  78. });
  79. Router.push(`/signature/letter/done/${id}`);
  80. }
  81. };
  82. render() {
  83. const { signature, nama, changesign } = this.state
  84. return (
  85. <ContentWrapper unwrap>
  86. <Modal isOpen={this.state.modal} >
  87. <ModalBody>
  88. <FormGroup row>
  89. <label className="col-md-2 col-form-label">Nama:<span className=' text-danger'>*</span></label>
  90. <div className="col-md-10">
  91. <Input type="text" value={this.state.nama} onChange={(e) => { this.updateValueNama(e) }} />
  92. </div>
  93. </FormGroup>
  94. <FormGroup row>
  95. <label className="col-md-2 col-form-label">Tanda Tangan:</label>
  96. <div className="col-md-10">
  97. <SignatureCanvas penColor='black' canvasProps={{ className: 'sigCanvas signature-style' }} ref={(ref) => { this.sigPad = ref }} onEnd={(e) => this.setState({ changesign: false })} />
  98. </div>
  99. </FormGroup>
  100. <ModalFooter>
  101. <Button color className="btn-login" onClick={this.updateValueSignature
  102. }>
  103. <span className="font-color-white">Simpan</span>
  104. </Button>
  105. <Button color className="btn-v2" onClick={() => { this.clear(), this.updateValueSignature() }}>
  106. Hapus
  107. </Button>
  108. </ModalFooter>
  109. <ModalFooter>
  110. <Button color className="bg-danger" onClick={this.toggleModal}>
  111. Batal
  112. </Button>
  113. <Button color disabled={signature === "" || signature === "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC" || nama === "" || changesign === false} className=" color-3e3a8e" onClick={this.onSubmit}>
  114. <span className="font-color-white ">Kirim</span>
  115. </Button>
  116. </ModalFooter>
  117. </ModalBody>
  118. </Modal>
  119. <div className='page-sign'>
  120. <div className=" ml-5">
  121. <p >
  122. Klik tombol Hadir untuk melakukan tanda tangan sebagai tanda bukti kehadiran rapat
  123. </p>
  124. <Button color="" className="btn-labeled-2" onClick={this.toggleModal}>
  125. <h4 className="mt-2 mb-md-2 text-center font-color-white pl-3 pr-3">Hadir</h4>
  126. </Button>
  127. </div>
  128. </div>
  129. </ContentWrapper>
  130. );
  131. }
  132. }
  133. PlenoSanksi.Layout = BasePage;
  134. export default PlenoSanksi;